﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using LarDosIdosos.Business.Model;
using LarDosIdosos.DataSources;

namespace LarDosIdosos
{
    public partial class CadastroFuncionario : System.Web.UI.Page
    {
        private Business.Model.Funcionario funcionario;
        private const string Acesso = "acesso";
        private const string Editar = "editar";
        private static string paginaDeOrigem;

        protected void Page_Load(object sender, EventArgs e)
        {
            CarregaFuncionario();
            if (!ValidaPermissao("acesso"))
            {
                Response.Redirect("~/Default.aspx");
            }
            var param1 = Request.QueryString["Alterar"];
            var param2 = Request.QueryString["Alterado"];
            if (!IsPostBack && !IsCallback)
            {
                if (!string.IsNullOrEmpty(param1) && !string.IsNullOrEmpty(param2))
                {
                    bool alterar;
                    if (bool.TryParse(param1, out alterar))
                    {
                        int codigo;
                        if (int.TryParse(param2, out codigo))
                        {
                            MontaPaginaComDetalhes(codigo, alterar);
                        }
                    }
                }
                paginaDeOrigem = "~" + HttpContext.Current.Request.UrlReferrer.LocalPath;
            }
        }

        private void CarregaFuncionario()
        {
            if (Session["usuario"] != null)
            {
                funcionario = (Business.Model.Funcionario)Session["usuario"];
            }
        }

        //Note: Valida a permissão do funcionario
        private bool ValidaPermissao(string tipo)
        {
            if (funcionario != null)
            {
                switch (tipo)
                {
                    case Acesso:
                        if (funcionario.Cargo_Funcionario.CodigoCargo == 1)
                        {
                            return true;
                        }
                        break;
                    case Editar:
                        if (funcionario.Cargo_Funcionario.CodigoCargo == 1)
                        {
                            return true;
                        }
                        break;
                }
            }
            return false;
        }

        private void MontaPaginaComDetalhes(int codigo, bool alterar)
        {
            DataSourceFuncionario dataSource = new DataSourceFuncionario();
            Funcionario funcionario = dataSource.BuscaFuncionario(codigo);
            if (alterar)
            {
                CarregaAlteracao(funcionario);
            }
            else
            {
                CarregaVisualizacao(funcionario);
            }
        }

        private void CarregaAlteracao(Funcionario funcionario)
        {
            try
            {
                hiddenFieldCodigo.Value = funcionario.Codigo_Funcionario.ToString();
                textBoxNome.Text = funcionario.Nome_Funcionario;
                dropDownListCargo.SelectedValue = funcionario.Cargo_Funcionario.CodigoCargo.ToString();
                dropDownListEstadoCivil.SelectedValue = funcionario.Sexo_Funcionario.Codigo_Sexo.ToString();
                textBoxCpf.Text = funcionario.CPF_Funcionario;
                textBoxRg.Text = funcionario.RG_Funcionario;
                TextBoxEmail.Text = funcionario.Email_Funcionario;
                textBoxSenha.Text = funcionario.Senha_Funcionario;

                repeaterTelefones.DataSource = funcionario.Telefones_Funcionario;
                repeaterTelefones.DataBind();

                textBoxGrauDeIntrucao.Text = funcionario.Grau_de_Instrucao_Funcionario;
                textBoxNomeDoPai.Text = funcionario.Nome_do_Pai_Funcionario;
                textBoxNomeDaMae.Text = funcionario.Nome_da_Mae_Funcionario;
                radioButtonListSexo.SelectedValue = funcionario.Sexo_Funcionario.Codigo_Sexo.ToString();
                textDataDeNascimento.Text =funcionario.Data_de_Nascimento_Funcionario.ToString("dd/MM/yyyy");
                trTipoRegistroExibicao.Visible = funcionario.Tipo_Registro_Profissional_Funcionario != "";
                if (trTipoRegistroExibicao.Visible)
                {
                    labelTipoRegistro.Text = funcionario.Tipo_Registro_Profissional_Funcionario;
                    textBoxRegistro.Text = funcionario.Registro_Profissional_Funcionario;
                }

            }
            catch (Exception ex)
            {
                throw new Exception("Erro ao carregar registro.", ex);
            }
        }

        public void CarregaVisualizacao(Funcionario funcionario)
        {
            try
            {
                labelNome.Text = funcionario.Nome_Funcionario;
                labelCargo.Text = funcionario.Cargo_Funcionario.NomeCargo;
                labelEstadoCivil.Text = funcionario.Estado_Civil.Nome_Estado_Civil;
                labelCpf.Text = funcionario.CPF_Funcionario;
                labelRg.Text = funcionario.RG_Funcionario;
                labelEmail.Text = funcionario.Email_Funcionario;
                labelSenha.Text = funcionario.Senha_Funcionario;

                repeaterTelefonesVisualizacao.DataSource = funcionario.Telefones_Funcionario;
                repeaterTelefonesVisualizacao.DataBind();

                labelGrauDeInstrucao.Text = funcionario.Grau_de_Instrucao_Funcionario;
                labelNomeDoPai.Text = funcionario.Nome_do_Pai_Funcionario;
                labelNomeDaMae.Text = funcionario.Nome_da_Mae_Funcionario;
                labelSexo.Text = funcionario.Sexo_Funcionario.Descricao_Sexo;
                labelDataDeNascimento.Text = funcionario.Data_de_Nascimento_Funcionario.ToString("dd/MM/yyyy");
                trTipoRegistroExibicao.Visible = funcionario.Tipo_Registro_Profissional_Funcionario != "";
                if(trTipoRegistroExibicao.Visible)
                {
                    labelTipoRegistroExibicao.Text = funcionario.Tipo_Registro_Profissional_Funcionario;
                    labelRegistroExibicao.Text = funcionario.Registro_Profissional_Funcionario;
                }
                divVisualizacao.Visible = true;
                divAlteracao.Visible = false;
            }
            catch (Exception ex)
            {
                throw new Exception("Erro ao carregar registro.", ex);
            }
        }

        protected void buttonSalvar_Onclick(object sender, EventArgs e)
        {
            try
            {
                if (!string.IsNullOrEmpty(hiddenFieldCodigo.Value))
                {
                    ArmazenaAlteracao();
                }
                else
                {
                    ArmazenaCadastro();
                }
            }
            catch (Exception ex)
            {

            }
        }

        private void ArmazenaCadastro()
        {
            try
            {
                Funcionario funcionario = new Funcionario();
                funcionario.Cargo_Funcionario = new Cargo();
                funcionario.Estado_Civil = new EstadoCivil();
                funcionario.Sexo_Funcionario = new Sexo();
                funcionario.Nome_Funcionario = textBoxNome.Text;
                funcionario.Cargo_Funcionario.CodigoCargo = Convert.ToInt32(dropDownListCargo.SelectedValue);
                funcionario.Estado_Civil.Codigo_Estado_Civil = Convert.ToInt32(dropDownListEstadoCivil.SelectedValue);
                funcionario.CPF_Funcionario = Util.CPF.ValidaCPF(textBoxCpf.Text);
                funcionario.Telefones_Funcionario = CriaListaDeTelefonePeloRepeater(repeaterTelefones);
                funcionario.RG_Funcionario = textBoxRg.Text;
                funcionario.Email_Funcionario = TextBoxEmail.Text;
                funcionario.Senha_Funcionario = textBoxSenha.Text;
                funcionario.Grau_de_Instrucao_Funcionario = textBoxGrauDeIntrucao.Text;
                funcionario.Nome_do_Pai_Funcionario = textBoxNomeDoPai.Text;
                funcionario.Nome_da_Mae_Funcionario = textBoxNomeDaMae.Text;
                funcionario.Sexo_Funcionario.Codigo_Sexo = Convert.ToInt32(radioButtonListSexo.SelectedValue);
                funcionario.Data_de_Nascimento_Funcionario = Convert.ToDateTime(textDataDeNascimento.Text,
                                                                                new CultureInfo("pt-BR"));
                funcionario.Tipo_Registro_Profissional_Funcionario = labelTipoRegistro.Text;
                funcionario.Registro_Profissional_Funcionario = textBoxRegistro.Text;
                DataSourceFuncionario dataSourceFuncionario = new DataSourceFuncionario();
                dataSourceFuncionario.Insert(funcionario);
                funcionario.Codigo_Funcionario = dataSourceFuncionario.BuscaFuncionarioPeloCPF(funcionario.CPF_Funcionario).Codigo_Funcionario;
                if (funcionario.Codigo_Funcionario != 0)
                {
                    dataSourceFuncionario.InsertTelefone(funcionario);
                }
                FinalizaCadastroComSucesso("Salvo com Sucesso!");
            }
            catch (Exception ex)
            {
                FinalizaCadastroComErro(ex.Message);
            }
        }

        private void ArmazenaAlteracao()
        {
            try
            {
                Funcionario funcionario = new Funcionario();
                funcionario.Cargo_Funcionario = new Cargo();
                funcionario.Estado_Civil = new EstadoCivil();
                funcionario.Sexo_Funcionario = new Sexo();
                funcionario.Codigo_Funcionario = Convert.ToInt32(hiddenFieldCodigo.Value);
                funcionario.Nome_Funcionario = textBoxNome.Text;
                funcionario.Cargo_Funcionario.CodigoCargo = Convert.ToInt32(dropDownListCargo.SelectedValue);
                funcionario.Estado_Civil.Codigo_Estado_Civil = Convert.ToInt32(dropDownListEstadoCivil.SelectedValue);
                funcionario.CPF_Funcionario = Util.CPF.ValidaCPF(textBoxCpf.Text);
                funcionario.RG_Funcionario = textBoxRg.Text;
                funcionario.Email_Funcionario = TextBoxEmail.Text;
                funcionario.Senha_Funcionario = textBoxSenha.Text;
                funcionario.Telefones_Funcionario = CriaListaDeTelefonePeloRepeater(repeaterTelefones);
                funcionario.Grau_de_Instrucao_Funcionario = textBoxGrauDeIntrucao.Text;
                funcionario.Nome_do_Pai_Funcionario = textBoxNomeDoPai.Text;
                funcionario.Nome_da_Mae_Funcionario = textBoxNomeDaMae.Text;
                funcionario.Sexo_Funcionario.Codigo_Sexo = Convert.ToInt32(radioButtonListSexo.SelectedValue);
                funcionario.Data_de_Nascimento_Funcionario = Convert.ToDateTime(textDataDeNascimento.Text,
                                                                                new CultureInfo("pt-BR"));
                funcionario.Tipo_Registro_Profissional_Funcionario = labelTipoRegistro.Text;
                funcionario.Registro_Profissional_Funcionario = textBoxRegistro.Text;
                DataSourceFuncionario dataSourceFuncionario = new DataSourceFuncionario();
                dataSourceFuncionario.Update(funcionario);
                dataSourceFuncionario.InsertTelefone(funcionario);
                FinalizaCadastroComSucesso("Salvo com Sucesso!");
            }
            catch (Exception ex)
            {
                FinalizaCadastroComErro(ex.Message);
            }
        }

        private void FinalizaCadastroComSucesso(string mensagem)
        {
            labelFeedback.Text = mensagem;
            labelFeedback.Attributes.Add("Style", "color:#00FF00");
        }

        private void FinalizaCadastroComErro(string mensagem)
        {
            labelFeedback.Text = "Erro! <br/>" + mensagem;
            labelFeedback.Attributes.Add("Style", "color:#FF0000");
        }
        
        protected void linkButtonVoltar_OnClick(object sender, EventArgs e)
        {
            Response.Redirect(paginaDeOrigem);
        }

        protected void dropDownListCargo_OnSelectedIndexChanged(object sender, EventArgs e)
        {
            switch (dropDownListCargo.SelectedValue)
            {
                case "4":
                    labelTipoRegistro.Text = "CRM";
                    textBoxRegistro.Text = "";
                    trTipoRegistro.Visible = true;
                    break;
                case "5":
                    labelTipoRegistro.Text = "COREN";
                    textBoxRegistro.Text = "";
                    trTipoRegistro.Visible = true;
                    break;
                default:
                    labelTipoRegistro.Text = "";
                    textBoxRegistro.Text = "";
                    trTipoRegistro.Visible = false;
                    break;
            }
        }
		
		protected void buttonAddTelefone_Click(object sender, EventArgs e)
		{
		    List<Telefone> telefones = CriaListaDeTelefonePeloRepeater(repeaterTelefones);
            telefones.Add(new Telefone{Codigo_Telefone = 0, Numero_Telefone = textBoxAddTelefone.Text});
		    repeaterTelefones.DataSource = telefones;
            repeaterTelefones.DataBind();
		    textBoxAddTelefone.Text = "";
		}

        private List<Telefone> CriaListaDeTelefonePeloRepeater(Repeater repeater)
        {
            List<Telefone> telefones = new List<Telefone>();
            foreach (RepeaterItem item in repeater.Items)
            {
                try
                {
                    Telefone telefone = new Telefone();

                    HiddenField hiddenField = (HiddenField) item.FindControl("hiddenFieldCodigoTelefone");
                    Literal literal = (Literal) item.FindControl("literalNumero");


                    telefone.Codigo_Telefone = Convert.ToInt32(hiddenField.Value);

                    telefone.Numero_Telefone = literal.Text;

                    telefones.Add(telefone);
                }
                catch(Exception)
                {
                    
                }
            }
            return telefones;
        }

        protected void repeaterTelefones_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            switch (e.CommandName)
            {
                case "deletar":
                    List<Telefone> telefones = CriaListaDeTelefonePeloRepeater(repeaterTelefones);
                    
                    HiddenField hiddenField = (HiddenField) e.Item.FindControl("hiddenFieldCodigoTelefone");
                    Literal literal = (Literal)e.Item.FindControl("literalNumero");

                    Telefone telefone = new Telefone();
                    telefone.Codigo_Telefone = Convert.ToInt32(hiddenField.Value);
                    telefone.Numero_Telefone = literal.Text;

                    IEnumerable<Telefone> enumerable = from tel in telefones
                                                       where
                                                           !(tel.Codigo_Telefone == telefone.Codigo_Telefone &&
                                                           tel.Numero_Telefone == telefone.Numero_Telefone)
                                                       select tel;
                    
                    repeaterTelefones.DataSource = enumerable.ToList();
                    repeaterTelefones.DataBind();
                    break;

            }
        }
    }
}